
#include "hmi_private.h"
#include "esp_log.h"

#define TAG "HMI"


/*!
 *  \brief  画面切换通知
 *  \details  当前画面改变时(或调用GetScreen)，执行此函数
 *  \param screen_id 当前画面ID
 */
void NotifyScreen(uint16_t screen_id)
{
    // TODO: 添加用户代码
    current_screen_id = screen_id; // 在工程配置中开启画面切换通知，记录当前画面ID

    // 进到画面3亮起一个按钮
    if (screen_id == 3)
    {
        SetButtonValue(3, 1, 1);
    }
    // 进到画面自动播放GIF
    if (current_screen_id == 9)
    {
        AnimationStart(9, 1); // 动画开始播放
    }

    // 进到二维码页面生成二维码
    if (current_screen_id == 14)
    {
        // 二维码控件显示中文字符时，需要转换为UTF8编码，
        // 通过“指令助手”，转换“www.gz-dc.com” ，得到字符串编码如下
        uint8_t dat[] = {0x77, 0x77, 0x77, 0x2E, 0x67, 0x7A, 0x2D, 0x64, 0x63, 0x2E, 0x63, 0x6F, 0x6D};
        SetTextValue(14, 1, dat); // 发送二维码字符编码
    }

    // 数据记录显示
    if (current_screen_id == 15)
    {
        Record_SetEvent(15, 1, 0, 0);
        Record_SetEvent(15, 1, 1, 0);
        Record_SetEvent(15, 1, 2, 0);
        Record_SetEvent(15, 1, 3, 0);
        Record_SetEvent(15, 1, 4, 0);
        Record_SetEvent(15, 1, 5, 0);
        Record_SetEvent(15, 1, 6, 0);
        Record_SetEvent(15, 1, 7, 0);
        delay(2000); // 延时两秒
        Record_ResetEvent(15, 1, 0, 0);
        Record_ResetEvent(15, 1, 1, 0);
        Record_ResetEvent(15, 1, 2, 0);
    }
    // 进入音乐画面自动播放
    if (current_screen_id == 18)
    {
        uint8_t buffer[19] = {0x94, 0x61, 0x3A, 0x2F, 0x73, 0x6F, 0x75, 0x6E, 0x64, 0x73, 0x2F, 0x30, 0x31, 0x2E, 0x6D, 0x70, 0x33};
        SetButtonValue(18, 3, 1);
        // PlayMusic(buffer);                                                           //播放音乐
    }
}

/*!
 *  \brief  触摸坐标事件响应
 *  \param press 1按下触摸屏，3松开触摸屏
 *  \param x x坐标
 *  \param y y坐标
 */
void NotifyTouchXY(uint8_t press, uint16_t x, uint16_t y)
{
    // TODO: 添加用户代码
}

/*!
 *  \brief  更新数据
 */
void UpdateUI()
{
}

/*!
 *  \brief  按钮控件通知
 *  \details  当按钮状态改变(或调用GetControlValue)时，执行此函数
 *  \param screen_id 画面ID
 *  \param control_id 控件ID
 *  \param state 按钮状态：0弹起，1按下
 */
void NotifyButton(uint16_t screen_id, uint16_t control_id, uint8_t state)
{

    ESP_LOGI(TAG, "NotifyButton:screen_id=%d,control_id=%d,state=%d", screen_id, control_id, state);
    if (screen_id == 0)
    {
        if (control_id == 8 && state == 1) // 获取时间
        {
            // SetTextValue(0, 3, (uint8_t *)"abcd");
            // Serial2.write(hexArray, sizeof(hexArray));
        }
    }

    if (screen_id == 1)
    {
        if (control_id == 4 && state == 1) // 获取时间
        {
            ota_processor.begin();
        }
    }
}

/*!
 *  \brief  文本控件通知
 *  \details  当文本通过键盘更新(或调用GetControlValue)时，执行此函数
 *  \details  文本控件的内容以字符串形式下发到MCU，如果文本控件内容是浮点值，
 *  \details  则需要在此函数中将下发字符串重新转回浮点值。
 *  \param screen_id 画面ID
 *  \param control_id 控件ID
 *  \param str 文本控件内容
 */
void NotifyText(uint16_t screen_id, uint16_t control_id, uint8_t *str)
{
    log_i("NotifyText:screen_id=%d,control_id=%d,str=%s", screen_id, control_id, str);
}

/*!
 *  \brief  进度条控件通知
 *  \details  调用GetControlValue时，执行此函数
 *  \param screen_id 画面ID
 *  \param control_id 控件ID
 *  \param value 值
 */
void NotifyProgress(uint16_t screen_id, uint16_t control_id, uint32_t value)
{
    // TODO: 添加用户代码
    log_i("NotifyProgress:screen_id=%d,control_id=%d,value=%d", screen_id, control_id, value);
}

/*!
 *  \brief  滑动条控件通知
 *  \details  当滑动条改变(或调用GetControlValue)时，执行此函数
 *  \param screen_id 画面ID
 *  \param control_id 控件ID
 *  \param value 值
 */
void NotifySlider(uint16_t screen_id, uint16_t control_id, uint32_t value)
{
}

/*!
 *  \brief  仪表控件通知
 *  \details  调用GetControlValue时，执行此函数
 *  \param screen_id 画面ID
 *  \param control_id 控件ID
 *  \param value 值
 */
void NotifyMeter(uint16_t screen_id, uint16_t control_id, uint32_t value)
{
    // TODO: 添加用户代码
}

/*!
 *  \brief  菜单控件通知
 *  \details  当菜单项按下或松开时，执行此函数
 *  \param screen_id 画面ID
 *  \param control_id 控件ID
 *  \param item 菜单项索引
 *  \param state 按钮状态：0松开，1按下
 */
void NotifyMenu(uint16_t screen_id, uint16_t control_id, uint8_t item, uint8_t state)
{
    // TODO: 添加用户代码
}

/*!
 *  \brief  选择控件通知
 *  \details  当选择控件变化时，执行此函数
 *  \param screen_id 画面ID
 *  \param control_id 控件ID
 *  \param item 当前选项
 */
void NotifySelector(uint16_t screen_id, uint16_t control_id, uint8_t item)
{
}

/*!
 *  \brief  定时器超时通知处理
 *  \param screen_id 画面ID
 *  \param control_id 控件ID
 */
void NotifyTimer(uint16_t screen_id, uint16_t control_id)
{
}

/*!
 *  \brief  读取用户FLASH状态返回
 *  \param status 0失败，1成功
 *  \param _data 返回数据
 *  \param length 数据长度
 */
void NotifyReadFlash(uint8_t status, uint8_t *_data, uint16_t length)
{
    // TODO: 添加用户代码
}

/*!
 *  \brief  写用户FLASH状态返回
 *  \param status 0失败，1成功
 */
void NotifyWriteFlash(uint8_t status)
{
    // TODO: 添加用户代码
}

/*!
 *  \brief  读取RTC时间，注意返回的是BCD码
 *  \param year 年（BCD）
 *  \param month 月（BCD）
 *  \param week 星期（BCD）
 *  \param day 日（BCD）
 *  \param hour 时（BCD）
 *  \param minute 分（BCD）
 *  \param second 秒（BCD）
 */
void NotifyReadRTC(uint8_t year, uint8_t month, uint8_t week, uint8_t day, uint8_t hour, uint8_t minute, uint8_t second)
{
    // uint8_t years;
    // uint8_t months;
    // uint8_t weeks;
    // uint8_t days;
    // uint8_t hours;
    // uint8_t minutes;
    // uint8_t sec;

    // sec =(0xff & (second>>4))*10 +(0xf & second);                                    //BCD码转十进制
    // years =(0xff & (year>>4))*10 +(0xf & year);
    // months =(0xff & (month>>4))*10 +(0xf & month);
    // weeks =(0xff & (week>>4))*10 +(0xf & week);
    // days =(0xff & (day>>4))*10 +(0xf & day);
    // hours =(0xff & (hour>>4))*10 +(0xf & hour);
    // minutes =(0xff & (minute>>4))*10 +(0xf & minute);
}